package org.convallaria.system.biz.util;

import org.convallaria.framework.common.constants.sys.UserConstants;
import org.convallaria.system.biz.entity.SysUser;

/**
 * 系统用户工具类
 * 
 * 功能特性：
 * - 提供用户相关的业务逻辑判断方法
 * - 提供用户状态、类型、性别等描述信息
 * - 提供用户数据验证方法
 * - 提供用户信息格式化方法
 * 
 * 设计原则：
 * - 纯静态方法，无状态
 * - 业务逻辑与实体类分离
 * - 便于单元测试
 * - 提高代码可维护性
 * 
 * @author convallaria
 * @since 1.0.0
 */
public class SysUserUtils {

    // ==================== 状态判断方法 ====================

    /**
     * 判断用户是否正常状态
     * 
     * @param user 用户对象
     * @return true=正常，false=停用
     */
    public static boolean isNormal(SysUser user) {
        if (user == null || user.getStatus() == null) {
            return false;
        }
        return UserConstants.USER_STATUS_NORMAL.equals(user.getStatus());
    }

    /**
     * 判断用户是否停用状态
     * 
     * @param user 用户对象
     * @return true=停用，false=正常
     */
    public static boolean isDisabled(SysUser user) {
        if (user == null || user.getStatus() == null) {
            return false;
        }
        return UserConstants.USER_STATUS_DISABLED.equals(user.getStatus());
    }

    /**
     * 判断用户状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidStatus(String status) {
        return UserConstants.isValidUserStatus(status);
    }

    // ==================== 用户类型判断方法 ====================

    /**
     * 判断是否为系统用户
     * 
     * @param user 用户对象
     * @return true=系统用户，false=其他类型
     */
    public static boolean isSystemUser(SysUser user) {
        if (user == null || user.getUserType() == null) {
            return false;
        }
        return UserConstants.USER_TYPE_SYSTEM.equals(user.getUserType());
    }

    /**
     * 判断是否为外部用户
     * 
     * @param user 用户对象
     * @return true=外部用户，false=其他类型
     */
    public static boolean isExternalUser(SysUser user) {
        if (user == null || user.getUserType() == null) {
            return false;
        }
        return UserConstants.USER_TYPE_EXTERNAL.equals(user.getUserType());
    }

    /**
     * 判断是否为API用户
     * 
     * @param user 用户对象
     * @return true=API用户，false=其他类型
     */
    public static boolean isApiUser(SysUser user) {
        if (user == null || user.getUserType() == null) {
            return false;
        }
        return UserConstants.USER_TYPE_API.equals(user.getUserType());
    }

    /**
     * 判断用户类型是否有效
     * 
     * @param userType 用户类型
     * @return true=有效，false=无效
     */
    public static boolean isValidUserType(String userType) {
        return UserConstants.isValidUserType(userType);
    }

    // ==================== 性别判断方法 ====================

    /**
     * 判断是否为男性
     * 
     * @param user 用户对象
     * @return true=男性，false=其他
     */
    public static boolean isMale(SysUser user) {
        if (user == null || user.getGender() == null) {
            return false;
        }
        return UserConstants.USER_SEX_MALE.equals(user.getGender());
    }

    /**
     * 判断是否为女性
     * 
     * @param user 用户对象
     * @return true=女性，false=其他
     */
    public static boolean isFemale(SysUser user) {
        if (user == null || user.getGender() == null) {
            return false;
        }
        return UserConstants.USER_SEX_FEMALE.equals(user.getGender());
    }

    /**
     * 判断性别是否有效
     * 
     * @param sex 性别值
     * @return true=有效，false=无效
     */
    public static boolean isValidSex(String sex) {
        return UserConstants.isValidUserSex(sex);
    }

    // ==================== 描述信息获取方法 ====================

    /**
     * 获取性别描述
     * 
     * @param sex 性别值
     * @return 性别描述
     */
    public static String getSexDesc(String sex) {
        return UserConstants.getUserSexDesc(sex);
    }

    /**
     * 获取状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getStatusDesc(String status) {
        return UserConstants.getUserStatusDesc(status);
    }

    /**
     * 获取用户类型描述
     * 
     * @param userType 用户类型
     * @return 用户类型描述
     */
    public static String getUserTypeDesc(String userType) {
        return UserConstants.getUserTypeDesc(userType);
    }

    // ==================== 数据验证方法 ====================

    /**
     * 验证用户信息是否完整
     * 
     * @param user 用户对象
     * @return true=完整，false=不完整
     */
    public static boolean isValidUser(SysUser user) {
        if (user == null) {
            return false;
        }
        
        // 必填字段验证
        if (user.getUserName() == null || user.getUserName().trim().isEmpty()) {
            return false;
        }
        if (user.getNickName() == null || user.getNickName().trim().isEmpty()) {
            return false;
        }
        if (user.getTenantId() == null) {
            return false;
        }
        
        // 状态验证
        if (!isValidStatus(user.getStatus())) {
            return false;
        }
        
        // 用户类型验证
        if (!isValidUserType(user.getUserType())) {
            return false;
        }
        
        // 性别验证
        if (user.getGender() != null && !isValidSex(user.getGender())) {
            return false;
        }
        
        return true;
    }

    /**
     * 验证用户名格式
     * 
     * @param userName 用户名
     * @return true=有效，false=无效
     */
    public static boolean isValidUserName(String userName) {
        if (userName == null || userName.trim().isEmpty()) {
            return false;
        }
        // 用户名长度限制
        if (userName.length() < UserConstants.USER_NAME_MIN_LENGTH || 
            userName.length() > UserConstants.USER_NAME_MAX_LENGTH) {
            return false;
        }
        // 用户名只能包含字母、数字、下划线
        return userName.matches(UserConstants.USER_NAME_PATTERN);
    }

    /**
     * 验证邮箱格式
     * 
     * @param email 邮箱
     * @return true=有效，false=无效
     */
    public static boolean isValidEmail(String email) {
        if (email == null || email.trim().isEmpty()) {
            return false;
        }
        // 邮箱长度限制
        if (email.length() > UserConstants.EMAIL_MAX_LENGTH) {
            return false;
        }
        // 邮箱格式验证
        return email.matches(UserConstants.EMAIL_PATTERN);
    }

    /**
     * 验证手机号格式
     * 
     * @param phoneNumber 手机号
     * @return true=有效，false=无效
     */
    public static boolean isValidPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.trim().isEmpty()) {
            return false;
        }
        // 手机号长度验证
        if (phoneNumber.length() != UserConstants.PHONE_NUMBER_LENGTH) {
            return false;
        }
        // 中国大陆手机号格式验证
        return phoneNumber.matches(UserConstants.PHONE_NUMBER_PATTERN);
    }

    // ==================== 格式化方法 ====================

    /**
     * 格式化用户显示名称
     * 
     * @param user 用户对象
     * @return 格式化后的显示名称
     */
    public static String formatDisplayName(SysUser user) {
        if (user == null) {
            return "未知用户";
        }
        
        String displayName = user.getNickName();
        if (displayName == null || displayName.trim().isEmpty()) {
            displayName = user.getUserName();
        }
        
        return displayName != null ? displayName : "未知用户";
    }

    /**
     * 格式化用户完整信息
     * 
     * @param user 用户对象
     * @return 格式化后的完整信息
     */
    public static String formatUserInfo(SysUser user) {
        if (user == null) {
            return "用户信息为空";
        }
        
        StringBuilder sb = new StringBuilder();
        sb.append("用户ID: ").append(user.getUserId()).append(", ");
        sb.append("用户名: ").append(user.getUserName()).append(", ");
        sb.append("昵称: ").append(user.getNickName()).append(", ");
        sb.append("状态: ").append(getStatusDesc(user.getStatus())).append(", ");
        sb.append("类型: ").append(getUserTypeDesc(user.getUserType()));
        
        return sb.toString();
    }
}
